\documentclass{ctexart}
\bibliographystyle{IEEEtran}
\usepackage{algorithm,algorithmic,amsmath,amsthm,amssymb,amsfonts}
\usepackage{listings,graphics}

\title{Project}
\author{张祺 3210104145}
\begin{document}
\maketitle


\section{运行说明}
本项目需要调用\verb|jsoncpp|与\verb|eigen3|库，故请在运行此项目前安装好这两个包。

在\verb|project|目录下使用\verb|make|命令即可编译整个项目并得到实验报告。

\section{程序设计思路}
所有实现样条计算的相关代码都在头文件\verb|spline.h|中，其中设计了一下几个类：
\subsection{Class Function}
其定义了\verb|()|,\verb|derivative|,\verb|sec_derivative|三个虚函数，分别用于函数求值，求导和求二阶导。

该基类有以下三个衍生类：
\begin{itemize}
\item \verb|Class Polynomial| 用于存储一个多项式函数，形如$\Sigma Co_i(x-x_0)^i$
\item \verb|Class B_spline| 用于存储一个$k$阶的B样条基函数，其控制点为$t$
\item \verb|Class Discrete_function| 利用离散的点构造一个函数以便后续操作
\end{itemize}
\subsection{Class Interpolation}

\begin{itemize}
\item \verb|Class ppForm_interpolation| 用于使用多项式进行样条插值
\item \verb|Class B_spline_interpolation| 用于使用B样条基函数进行样条插值
\item \verb|Class curve_spline| 用于对空间中的曲线进行拟合
\end{itemize}
以上前两个类可以在初始化时制定样条的阶数$order=1 or 2 or 3$，1对应线性样条，2 or 3对应二或者三次样条($\mathbb{S}_3^2$)；以及边界条件$condition=1 or 2 or 3$,m,1对应complete cubic spline，2对应cubic spline with specified second derivatives at its end points，3对应natural cubic spline.

\section{作业题运行结果}
\subsection{A}
对不同的插值点数$N$,使用多项式样条拟合图像。结果如下：
\begin{figure}[H]
  \centering
  \includegraphics[width=0.7\textwidth]{../pic/A.eps}
  \caption{三次样条拟合图像}
\end{figure}
容易发现随着$N$的变大，拟合结果没有发生龙格现象，为了判断其究竟是否更加精准，此处做出其最大误差的自然对数和$N$的关系并作图。

\begin{figure}[H]
  \centering
  \includegraphics[width=0.55\textwidth]{../pic/A2.eps}
  \caption{误差变化曲线}
\end{figure}
\begin{table}[]
  \begin{tabular}{|l|l|l|l|l|l|l|l|l|l|}
    \hline
    \multicolumn{1}{|r|}{N} & 6      & 11     & 21    & 41            & 81             \\ \hline
    err\_max                & 0.4217 & 0.0219 & 0.003 & $2.7*10^{-4}$ & $1.6*10^{-5}$  \\ \hline
  \end{tabular}
\end{table}
容易发现该样条的拟合精度随着$N$的变大而提升，其收敛阶至少大于3.

为了更精确的判断收敛阶的大小，求最大误差序列前一项与后一项的比值并作图如下：
\begin{figure}[H]
  \centering
  \includegraphics[width=0.55\textwidth]{../pic/A3.eps}
  \caption{误差变化曲线}
\end{figure}

可以发现，随着N的增长，$N$每增大为原先的2倍，误差缩小为之前的$\frac{1}{16}$，故三次B样条的误差收敛阶为$\sqrt[2]{16}=4$
\subsection{B}
实现代码可见\verb|spline.h|
\subsection{C}
使用完全三次基数B样条和完全二次基数B样条分别拟合函数$f(x)=\frac{1}{1+x^2}$,结果如下图：
\begin{figure}[H]
  \centering
  \includegraphics[width=0.55\textwidth]{../pic/C.eps}
  \caption{$f(x)=\frac{1}{1+x^2}$拟合结果}
\end{figure}

显然，三次样条的结果更精确。
\subsection{D}
问题C中的两个样条的误差如下图：
\begin{figure}[H]
  \centering
  \includegraphics[width=0.55\textwidth]{../pic/D.eps}
  \caption{误差变化曲线}
\end{figure}

可以发现在插值节点处的误差极小，接近机器精度，因为插值时我们给了这些位置的精确信息，故结果也很精确。

此外从图像也可以看出，三次样条的误差更小。

\subsection{E}
将$(0,\pm\frac{2}{3}\sqrt{3}),\quad(\pm\sqrt{3},\frac{2}{3}\sqrt[4]{3})$设为特征点，使用三次B样条的拟合结果如下：
\begin{figure}[H]
  \centering
  \includegraphics[width=0.55\textwidth]{../pic/E.eps}
  \caption{三次B样条心形拟合结果}
\end{figure}

从图像可以看出$N=40$时的拟合结果已经较为优秀。对于边界条件，natural cubic spline的边界条件最合适，因为离散的点值难以计算边界的导数，而规定其二阶导为0较为方便。


\end{document} 
